package com.kyd.push.common.result;

import com.alibaba.fastjson.JSON;

import java.util.HashMap;
import java.util.Map;

/**
 * Ret 结果集封装，也用于服务端与客户端的 json 数据通信
 * 其中 status=1 为成功，其它情况值为失败或错误
 *
 * 结果集数据:
 * {
 *     "status": 1,
 *     "message": "成功",
 *     "data": []
 * }
 *
 * @author kejw on 2018/6/27
 */
@SuppressWarnings({"serial", "rawtypes", "unchecked"})
public class Ret extends HashMap {

	/** 状态码 1: 成功; 其它值为失败 */
	private static final String STATUS = "status";
	/** 响应信息 */
	private static final String MESSAGE = "message";
	/** 数据对象 */
	private static final String DATA = "data";


	private static final int STATUS_OK   = RetCode.OK.value();   // 成功
	private static final int STATUS_FAIL = RetCode.FAIL.value(); // 失败/错误

	public Ret(){}

	public static Ret create() {
		return new Ret();
	}

	public static Ret create(Object key, Object value) {
		return Ret.create().set(key, value);
	}

	public static Ret ok() {
		return ok("ok");
	}

	public static Ret ok(String message) {
		return Ret.create(STATUS, STATUS_OK).message(message);
	}

	public static Ret fail() {
		return fail("fail");
	}

	public static Ret fail(String message) {
		return fail(STATUS_FAIL, message);
	}

	public static Ret fail(RetCode retCode, String message) {
		return fail(retCode.value(), message);
	}

	public static Ret fail(int status, String message) {
		return Ret.create(STATUS, status).message(message);
	}

	//-------------------------------------------------------------------

	public boolean isOk() {
		Integer code = getInt(STATUS);
		if (code == null) {
			throw new IllegalStateException("必须先调用 ok() 或 fail()方法");
		}
		return STATUS_OK == code ? true : false;
	}

	public boolean isFail() {
		Integer code = getInt(STATUS);
		if (code == null) {
			throw new IllegalStateException("必须先调用 ok() 或 fail()方法");
		}
		return STATUS_OK == code ? false : true;
	}

	public Ret set(Object key, Object value) {
		this.put(key, value);
		return this;
	}

	public Ret set(Map map) {
		this.putAll(map);
		return this;
	}

	public Ret delete(Object key) {
		this.remove(key);
		return this;
	}

	public Ret message(String message) {
		this.put(MESSAGE, message);
		return this;
	}

	public String getMessage() {
		return (String)get(MESSAGE);
	}

	public Ret data(Object data) {
		return set(DATA, data);
	}

	public <T> T getData() {
		return (T)get(DATA);
	}

	//-------------------------------------------------------------------

	public <T> T getAs(Object key) {
		return (T)get(key);
	}

	public String getStr(Object key) {
		return (String)get(key);
	}

	public Integer getInt(Object key) {
		return (Integer)get(key);
	}

	public Long getLong(Object key) {
		return (Long)get(key);
	}

	public Number getNumber(Object key) {
		return (Number)get(key);
	}

	public Boolean getBoolean(Object key) {
		return (Boolean)get(key);
	}

	/**
	 * key 存在，并且 value 不为 null
	 */
	public boolean notNull(Object key) {
		return get(key) != null;
	}

	/**
	 * key 不存在，或者 key 存在但 value 为null
	 */
	public boolean isNull(Object key) {
		return get(key) == null;
	}

	/**
	 * key 存在，并且 value 为 true，则返回 true
	 */
	public boolean isTrue(Object key) {
		Object value = get(key);
		return (value instanceof Boolean && ((Boolean)value == true));
	}

	/**
	 * key 存在，并且 value 为 false，则返回 true
	 */
	public boolean isFalse(Object key) {
		Object value = get(key);
		return (value instanceof Boolean && ((Boolean)value == false));
	}

	public String toJson() {
		return JSON.toJSONString(this);
	}
}



//public class Ret {
//	public interface View{}  // 用于 @JsonView 视图输出，所有都继承于这个, 否则 json 将输出为 "{}"
//
//	private static final int STATUS_OK = 1;   // 成功
//	private static final int STATUS_FAIL = 0; // 失败
//
//	/**
//	 * 状态: 0:失败; 1:成功
//	 */
//	@JsonView(View.class)
//	private int status;
//
//	/**
//	 * 响应状态码
//	 */
//	@JsonView(View.class)
//	private int statusCode;
//
//	/**
//	 * 信息
//	 */
//	@JsonView(View.class)
//	private String message;
//
//	/**
//	 * 数据对象，为null时不输出
//	 */
//	@JsonView(View.class)
//	@JsonInclude(JsonInclude.Include.NON_NULL)
//	private Object data;
//
//	public Ret(){}
//
//	public static Ret create() {
//		return new Ret();
//	}
//
//	public static Ret create(int status, RetCode retCode) {
//		return Ret.create().status(status).statusCode(retCode);
//	}
//
//	public static Ret ok() {
//		return ok("成功");
//	}
//
//	public static Ret ok(String message) {
//		return Ret.create(STATUS_OK, RetCode.OK).message(message);
//	}
//
//	public static Ret fail() {
//		return fail("失败");
//	}
//
//	public static Ret fail(String message) {
//		return fail(RetCode.FAIL, message);
//	}
//
//	public static Ret fail(RetCode retCode, String message) {
//		return Ret.create(STATUS_FAIL, retCode).message(message);
//	}
//
//	public Ret status(int status) {
//		this.status = status;
//		return this;
//	}
//
//	public Ret statusCode(RetCode retCode) {
//		this.statusCode = retCode.value();
//		return this;
//	}
//
//	public Ret message(String message) {
//		this.message = message;
//		return this;
//	}
//
//	public Ret data(Object data) {
//		this.data = data;
//		return this;
//	}
//
//	@JsonIgnore
//	public boolean isOk() {
//		return this.status == STATUS_OK ? true : false;
//	}
//
//	@JsonIgnore
//	public boolean isFail() {
//		return this.status == STATUS_FAIL ? true : false;
//	}
//
//	public String toJson() {
//		return JSON.toJSONString(this);
//	}
//
//	///////////////////////////////////////////////////////
//
//	public int getStatus() {
//		return status;
//	}
//
//	public void setStatus(int status) {
//		this.status = status;
//	}
//
//	public int getStatusCode() {
//		return statusCode;
//	}
//
//	public void setStatusCode(int statusCode) {
//		this.statusCode = statusCode;
//	}
//
//	public String getMessage() {
//		return message;
//	}
//
//	public void setMessage(String message) {
//		this.message = message;
//	}
//
//	public <T> T getData() {
//		return (T)data;
//	}
//
//	public void setData(Object data) {
//		this.data = data;
//	}
//}
